<template>
    <view class="u-load-more-wrap" :style="{
        backgroundColor: bgColor,
        marginBottom: marginBottom + 'rpx',
        marginTop: marginTop + 'rpx',
        height: $u.addUnit(height)
    }">
        <u-line color="#d4d4d4" length="50"></u-line>
        <!-- 加载中和没有更多的状态才显示两边的横线 -->
        <view :class="status == 'loadmore' || status == 'nomore' ? 'u-more' : ''" class="u-load-more-inner">
            <view class="u-loadmore-icon-wrap">
                <u-loading class="u-loadmore-icon" :color="iconColor" :mode="iconType == 'circle' ? 'circle' : 'flower'" :show="status == 'loading' && icon"></u-loading>
            </view>
            <!-- 如果没有更多的状态下，显示内容为dot（粗点），加载特定样式 -->
            <view class="u-line-1" :style="[loadTextStyle]" :class="[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']" @tap="loadMore">
                {{ showText }}
            </view>
        </view>
        <u-line color="#d4d4d4" length="50"></u-line>
    </view>
</template>

<script>
    /**
     * loadmore 加载更多
     * @description 此组件一般用于标识页面底部加载数据时的状态。
     * @tutorial https://www.uviewui.com/components/loadMore.html
     * @property {String} status 组件状态（默认loadmore）
     * @property {String} bg-color 组件背景颜色，在页面是非白色时会用到（默认#ffffff）
     * @property {Boolean} icon 加载中时是否显示图标（默认true）
     * @property {String} icon-type 加载中时的图标类型（默认circle）
     * @property {String} icon-color icon-type为circle时有效，加载中的动画图标的颜色（默认#b7b7b7）
     * @property {Boolean} is-dot status为nomore时，内容显示为一个"●"（默认false）
     * @property {String} color 字体颜色（默认#606266）
     * @property {String Number} margin-top 到上一个相邻元素的距离
     * @property {String Number} margin-bottom 到下一个相邻元素的距离
     * @property {Object} load-text 自定义显示的文字，见上方说明示例
     * @event {Function} loadmore status为loadmore时，点击组件会发出此事件
     * @example <u-loadmore :status="status" icon-type="iconType" load-text="loadText" />
     */
    export default {
        name: "u-loadmore",
        props: {
            // 组件背景色
            bgColor: {
                type: String,
                default: 'transparent'
            },
            // 是否显示加载中的图标
            icon: {
                type: Boolean,
                default: true
            },
            // 字体大小
            fontSize: {
                type: String,
                default: '28'
            },
            // 字体颜色
            color: {
                type: String, 
                default: '#606266'
            },
            // 组件状态，loadmore-加载前的状态，loading-加载中的状态，nomore-没有更多的状态
            status: {
                type: String,
                default: 'loadmore'
            },
            // 加载中状态的图标，flower-花朵状图标，circle-圆圈状图标
            iconType: {
                type: String,
                default: 'circle'
            },
            // 显示的文字
            loadText: {
                type: Object,
                default () {
                    return {
                        loadmore: '加载更多',
                        loading: '正在加载...',
                        nomore: '没有更多了'
                    }
                }
            },
            // 在“没有更多”状态下，是否显示粗点
            isDot: {
                type: Boolean,
                default: false
            },
            // 加载中显示圆圈动画时，动画的颜色
            iconColor: {
                type: String,
                default: '#b7b7b7'
            },
            // 上边距
            marginTop: {
                type: [String, Number],
                default: 0
            },
            // 下边距
            marginBottom: {
                type: [String, Number],
                default: 0
            },
            // 高度，单位rpx
            height: {
                type: [String, Number],
                default: 'auto'
            }
        },
        data() {
            return {
                // 粗点
                dotText: "●"
            }
        },
        computed: {
            // 加载的文字显示的样式
            loadTextStyle() {
                return {
                    color: this.color,
                    fontSize: this.fontSize + 'rpx',
                    position: 'relative',
                    zIndex: 1,
                    backgroundColor: this.bgColor,
                    // 如果是加载中状态，动画和文字需要距离近一点
                }
            },
            // 加载中圆圈动画的样式
            cricleStyle() {
                return {
                    borderColor: `#e5e5e5 #e5e5e5 #e5e5e5 ${this.circleColor}`
                }
            },
            // 加载中花朵动画形式
            // 动画由base64图片生成，暂不支持修改
            flowerStyle() {
                return {
                }
            },
            // 显示的提示文字
            showText() {
                let text = '';
                if(this.status == 'loadmore') text = this.loadText.loadmore;
                else if(this.status == 'loading') text = this.loadText.loading;
                else if(this.status == 'nomore' && this.isDot) text = this.dotText;
                else text = this.loadText.nomore;
                return text;
            }
        },
        methods: {
            loadMore() {
                // 只有在“加载更多”的状态下才发送点击事件，内容不满一屏时无法触发底部上拉事件，所以需要点击来触发
                if(this.status == 'loadmore') this.$emit('loadmore');
            }
        }
    }
</script>

<style scoped lang="scss">
    @import "../../libs/css/style.components.scss";
    
    /* #ifdef MP */
    // 在mp.scss中，赋予了u-line为flex: 1，这里需要一个明确的长度，所以重置掉它
    // 在组件内部，把组件名(u-line)当做选择器，在微信开发工具会提示不合法，但不影响使用
    u-line {
        flex: none;
    }
    /* #endif */
    
    .u-load-more-wrap {
        @include vue-flex;
        justify-content: center;
        align-items: center;
    }
    
    .u-load-more-inner {
        @include vue-flex;
        justify-content: center;
        align-items: center;
        padding: 0 12rpx;
    }
    
    .u-more {
        position: relative;
        @include vue-flex;
        justify-content: center;
    }
    
    .u-dot-text {
        font-size: 28rpx;
    }
    
    .u-loadmore-icon-wrap {
        margin-right: 8rpx;
    }
    
    .u-loadmore-icon {
        @include vue-flex;
        align-items: center;
        justify-content: center;
    }
</style>
